home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d20 / doorskl3.arc / MTASK.C < prev    next >
C/C++ Source or Header  |  1992-01-15  |  4KB  |  184 lines

  1. /**********************************************************/
  2. /* Functions to help DOORSKEL get along with multitaskers */
  3. /* and other mumbo-jumbo                                  */
  4. /**********************************************************/
  5.  
  6. #include "doorskel.h"
  7.  
  8. static union REGS rg;
  9. static int mtask = 0;            /* type of multitasker, if any */
  10.  
  11. #define DVID    1
  12. #define DDOSID  2
  13. #define MOSID   3
  14. #define TVID    4
  15. #define OS2ID   5
  16.  
  17. static int  _fastcall is_dv (void);
  18. static int  _fastcall is_ddos (void);
  19. static int  _fastcall is_mos (void);
  20. static int  _fastcall is_tv (void);
  21. static int  _fastcall is_os2 (void);
  22. static void _fastcall pause_dv (void);
  23. static void _fastcall pause_ddos (void);
  24. static void _fastcall pause_tv (void);
  25. static void _fastcall pause_mos (void);
  26. static void _fastcall pause_os2 (void);
  27.  
  28.  
  29.  
  30.  
  31.  
  32. void _fastcall set_mtask (void) {
  33.  
  34.     if(is_dv()) mtask=DVID;
  35.     else if(is_ddos()) mtask = DDOSID;
  36.     else if(is_mos()) mtask = MOSID;
  37.     else if(is_tv()) mtask = TVID;
  38.     else if(is_os2()) mtask = OS2ID;
  39. }
  40.  
  41.  
  42. static int _fastcall is_dv (void) {
  43.  
  44.     rg.x.cx=0x04445;
  45.     rg.x.dx=0x05351;
  46.     rg.x.ax=0x02b01;
  47.     int86(0x21,&rg,&rg);
  48.     if(rg.h.al==0x0ff) return 0;
  49.     return rg.x.bx;
  50. }
  51.  
  52.  
  53. static int _fastcall is_ddos (void) {
  54.  
  55.     rg.h.ah=0x0e4;
  56.     int86(0x21,&rg,&rg);
  57.     if(rg.h.al==1 || rg.h.al==2) return 1;
  58.     return 0;
  59. }
  60.  
  61.  
  62. static int _fastcall is_mos (void) {
  63.  
  64.     int temp;
  65.  
  66.     rg.h.ah=0x030;
  67.     int86(0x21,&rg,&rg);
  68.     temp=rg.x.ax;
  69.     rg.x.ax=0x03000;
  70.     rg.x.bx=0x03000;
  71.     rg.x.cx=0x03000;
  72.     rg.x.dx=0x03000;
  73.     int86(0x21,&rg,&rg);
  74.     if(rg.x.ax==temp) return temp;
  75.     return 0;
  76. }
  77.  
  78.  
  79. static int _fastcall is_tv (void) {
  80.  
  81.     rg.x.ax=0x01022;
  82.     rg.x.bx=0;
  83.     int86(0x15,&rg,&rg);
  84.     if(!rg.x.bx) return 0;
  85.     return rg.x.bx;
  86. }
  87.  
  88.  
  89. static int _fastcall is_os2 (void) {
  90.  
  91.     rg.x.ax = 0x1680;
  92.     int86(0x2f,&rg,&rg);
  93.     return (rg.h.al == 0);
  94. }
  95.  
  96.  
  97. static void _fastcall pause_dv (void) {
  98.  
  99.     rg.x.ax = 0x0101a;
  100.     int86(0x15,&rg,&rg);
  101.     rg.x.ax = 0x01000;
  102.     int86(0x15,&rg,&rg);
  103.     rg.x.ax = 0x01025;
  104.     int86(0x15,&rg,&rg);
  105. }
  106.  
  107.  
  108. static void _fastcall pause_ddos (void) {
  109.  
  110.     int86(0xf4,&rg,&rg);
  111. }
  112.  
  113.  
  114. static void _fastcall pause_tv (void) {
  115.  
  116.     rg.x.ax = 0x01000;
  117.     int86(0x15,&rg,&rg);
  118. }
  119.  
  120.  
  121. static void _fastcall pause_mos (void) {
  122.  
  123.     rg.x.ax = 0x0703;
  124.     rg.x.bx = 0x03;
  125.     rg.x.cx = 0;
  126.     rg.x.dx = 0;
  127.     int86(0x38,&rg,&rg);
  128. }
  129.  
  130.  
  131. static void _fastcall pause_os2 (void) {
  132.  
  133.     rg.x.ax = 0x1680;
  134.     int86(x2f,&rg,&rg);
  135. }
  136.  
  137.  
  138. void _fastcall pause_mtask (void) {
  139.  
  140.    switch(mtask) {
  141.         case 0:         break;
  142.  
  143.         case DVID:      pause_dv();
  144.                         break;
  145.  
  146.         case DDOSID:    pause_ddos();
  147.                         break;
  148.  
  149.         case TVID:      pause_tv();
  150.                         break;
  151.  
  152.         case MOSID:     pause_mos();
  153.                         break;
  154.  
  155.         case OS2ID:     pause_os2();
  156.                         break;
  157.  
  158.         default:        break;
  159.     }
  160.     int86(0x28,&rg,&rg);    /* DOS scheduler interrupt */
  161. }
  162.  
  163.  
  164.  
  165. void _fastcall my_sleep (int secs) {         /* snooze a while */
  166.  
  167.     clock_t t1;
  168.  
  169.  
  170.     t1 = clock() + ((clock_t)secs * (clock_t)CLOCKS_PER_SEC);
  171.     while(clock() < t1) pause_mtask();
  172. }
  173.  
  174.  
  175.  
  176. void _fastcall DosSleep (clock_t millisecs) {    /* snooze a short while */
  177.  
  178.     clock_t t1;
  179.  
  180.  
  181.     t1 = clock() + millisecs;
  182.     while(clock() < t1) pause_mtask();
  183. }
  184.